module.exports = app => {
  const express = require('express')
  const jwt = require('jsonwebtoken')
  const AdminUser = require('../../models/AdminUser')
  const router = express.Router({
    // 合并URL参数
    mergeParams: true
  })

  // 创建资源
  router.post('/', async (req, res) => {
    const model = await req.Model.create(req.body)
    res.send(model)
  })
  // 更新资源
  router.put('/:id', async (req, res) => {
    const model = await req.Model.findByIdAndUpdate(req.params.id, req.body)
    res.send(model)
  })
  // 删除资源
  router.delete('/:id', async (req, res) => {
    const model = await req.Model.findByIdAndDelete(req.params.id, req.body)
    res.send({
      success: true
    })
  })
  // 资源列表
  // 加一个中间键处理函数
  router.get('/', async (req, res, next) => {
    // 校验用户是否登录
    // split 分割 pop 获取最后一个元素
    const token = String(req.headers.authorization || '').split(' ').pop()
    // 提取token数据 , verify 校验验证对错
　　const { id } = jwt.verify(token,app.get('secret'))
    // findById 通过id在数据库中找用户是否真实存在
    // 挂在到req上面表示用户端请求的用户对象是谁
    req.user = await AdminUser.findById(id)
    console.log(req.user)
    await next()
  }, async (req, res) => {
    const queryOptions = {}
    if (req.Model.modelName === 'Category') {
      queryOptions.populate = 'parent'
    }
    const items = await req.Model.find().setOptions(queryOptions).limit(10)
    res.send(items)
  })
  // 资源详情
  router.get('/:id', async (req, res) => {
    const model = await req.Model.findById(req.params.id)
    res.send(model)
  })
  // 通用CRUD接口 resource 资源
  app.use('/admin/api/rest/:resource', async (req, res, next) => {
    const modelName = require('inflection').classify(req.params.resource)
    req.Model = require(`../../models/${modelName}`)
    next()
  }, router)
  // 导入上传中间键，dest 指目标地址 __dirname 指绝对地址
  const multer = require('multer')
  const upload = multer({ dest: __dirname + '/../../uploads' })
  app.post('/admin/api/upload', upload.single('file'), async (req, res) => {
    const file = req.file
    file.url = `http://localhost:3000/u模块ploads/${file.filename}`
    res.send(file)
  })

  // 用户登录的接口
  app.post('/admin/api/login', async (req, res) => {
    const { username, password } = req.body
    // 1.根据用户名找用户
    // + 表示被强制选择
    const user = await AdminUser.findOne({ username }).select('+password')
    if (!user) {
      return res.status(422).send({
        message: '用户不存在'
      })
    }
    // 2.校验密码
    const isValid = require('bcrypt').compareSync(password, user.password)
    if (!isValid) {
      return res.status(422).send({
        message: '密码错误'
      })
    }
    // 3.返回token
    // sign 签名用来生成一个token 
    // 第一个参数payload表示要放在token里面的数据，把数据拿来进行散列，生成一个字符串给客户进行使用
    // 第二个参数secret是指用户生成token的时候给一个密钥，根据一定算法生成token
    const token = jwt.sign({ id: user._id }, app.get('secret'))
    res.send({ token })
  })
}